/***************************************************************************************************
 *Copyright(C),2010-2016,Sumscope
 *FileName	:  gbkmap.h
 *Author	:  scofined.qi
 *Version	:  1.0
 *Date		:  2015/12/22
 *Desc		:  //用于主要说明此程序文件完成的主要功能
 *Relation :
 *Others	:  //其他内容说明
 *Function :  //主要函数列表，每条记录应包含函数名及功能简要说明
 *History	:
 * //修改历史记录列表，每条修改记录应包含修改日期、修改者及修改内容简介
 ***************************************************************************************************/
#pragma once

#include "BaseString.h"
#include "simple_array.h"

namespace qb {
namespace base {
enum kGbkHanziType {
  kGbkHanziTypeGbk1 = 0,  // A1A1-A9FE	GB 2312 非汉字符号区，计符号 717 个
  kGbkHanziTypeGbk2,  // B0A1-F7FE	GB 2312 汉字区,收录汉字 6763 个
  kGbkHanziTypeGbk3,  // 8140-A0FE	扩充汉字区，收录 GB 13000.1 中的 CJK
                      // 汉字 6080 个
  kGbkHanziTypeGbk4,  // AA40-FEA0	扩充汉字区，收录 CJK 汉字和增补的汉字
                      // 8160 个CJK 汉字在前，按 UCS 代码大小排列
  kGbkHanziTypeGbk5,  // A840-A9A0	GB 13000.1 扩充非汉字区，BIG-5
                      // 非汉字符号、结构符和“○”排列在此区。计符号 166 个
  kGbkHanziTypeUser1,  // 用户自定义区 AAA1-AFFE，码位 564 个
  kGbkHanziTypeUser2,  // 用户自定义区 F8A1-FEFE，码位 658 个
  kGbkHanziTypeUser3,  // 用户自定义区 A140-A7A0，码位 672 个
  kGbkHanziTypeCount
};
class CGbkMap {
  typedef unsigned char uchar;
  typedef unsigned short ushort;
  class GbkArea {
   public:
    uchar lowLeft;
    uchar lowRight;
    uchar hiBottom;
    uchar hiTop;
    int count;
    bool has7f;
    kGbkHanziType type;
    GbkArea(){};
    GbkArea(ushort p1, ushort p2, kGbkHanziType t, int num);
    bool exist(uchar x, uchar y);
    unsigned short get(int i);
  };
  GbkArea m_areas[kGbkHanziTypeCount];

 public:
  CGbkMap();
  bool IsHanzi(const unsigned char* gbk);
  bool IsGbkCode(const unsigned char* gbk);
  kGbkHanziType GetGbkType(const unsigned char* gbk);
  int GetCount();

  int GetHanziCount(kGbkHanziType type) { return m_areas[type].count; }
  unsigned short GetHanzi(kGbkHanziType type, int i) {
    return m_areas[type].get(i);
  }

  int GetAreaString(kGbkHanziType type, char* buf, int count);
  BaseString GetAreaString(kGbkHanziType type);
  bool IsGbkString(const char* str, int len);
  bool IsVisibleChar(unsigned char c);
};

// 繁T<==>简S汉字转化
wchar_t S2T(wchar_t c);
wchar_t T2S(wchar_t c);
void STConvert(wchar_t* str, int len, bool s2t);

}  // namespace base
}  // namespace qb
